package com.zuoshenge.main.excel.importt.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.zuoshenge.main.entity.Course;
import com.zuoshenge.main.service.CourseService;
import com.zuoshenge.tool.excel.ExcelDataModelListener;
import com.zuoshenge.tool.excel.ExcelImportService;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Component
public class CourseExcelImportListener extends ExcelDataModelListener<Course> {

    // 设置批量处理的数据大小
    private static final int BATCH_SIZE = 1000;

    // 用于暂存读取的数据，直到达到批量大小
    private List<Course> batch = new ArrayList<>();

    @Resource
    private CourseService courseService;

    public CourseExcelImportListener(ExcelImportService<Course> dataService) {
        super(dataService);
    }

    // 每读取一行数据都会调用此方法
    @Override
    public void invoke(Course data, AnalysisContext context) {
        // 检查数据的合法性及有效性
        System.out.println(data.toString());
        if (validateData(data)) {
            // 有效数据添加到list中
//            Course course = new Course(null, "222", "1231", "13", "1231", 1, 1, 1, "ad09sa8");
//            batch.add(course);
            batch.add(data);
        } else {
            // 处理无效数据，例如记录日志或跳过
            throw new RuntimeException("异常！excel中包含无效数据！例如数据重复");
        }

        // 当达到批量大小时，处理这批数据
        if (batch.size() >= BATCH_SIZE) {
            System.out.println("sb2");
            processBatch();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        System.out.println("sb1");
        if (!batch.isEmpty()) {
            processBatch();
        }
    }

    // 省略了validateData方法和其他方法的实现，因为它们已经在原始代码中给出

    // 处理一批数据的方法
    private void processBatch() {
        int retryCount = 0;
        // 重试逻辑
        while (retryCount < 3) {
            try {
                // 尝试批量插入
                courseService.batchInsert(batch);
                // 清空批量数据，以便下一次批量处理
                batch.clear();
                break;
            } catch (Exception e) {
                // 重试计数增加
                retryCount++;
                // 如果重试3次都失败，记录错误日志
                if (retryCount >= 3) {
                     // logError(e, batch);
                    throw new RuntimeException("异常！导入excel失败");
                }
            }
        }
//        throw new RuntimeException("逗你玩");
    }

    private boolean validateData(Course course) {
        Long count = courseService.count(course);
        return count == 0;
    }
}
